package com.junge.jedis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 类描述 :
 * @author xiaojun.yin
 * @version 1.0
 * 2018年12月5日 上午9:23:35
 */
/**
 * @author gufeng.yin
 *
 */
public class JedisFactory {
	
	// private static String ADDR = "192.168.10.19";
		private  String ADDR = "200.200.200.52"; // 本地
		// Redis的端口号
		private  int PORT = 6379;

		// 访问密码
		private  String AUTH ;

		private  String userName ;
		// 可用连接实例的最大数目，默认值为8；
		// 如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。
		private  int MAX_ACTIVE = 1024;

		// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例，默认值也是8。
		private  int MAX_IDLE = 200;

		// 等待可用连接的最大时间，单位毫秒，默认值为-1，表示永不超时。如果超过等待时间，则直接抛出JedisConnectionException；
		private  int MAX_WAIT = 10000;

		private  int TIMEOUT = 10000;

		// 在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
		private  boolean TEST_ON_BORROW = true;

		private  JedisPool jedisPool = null;
		
		private JedisPoolConfig config ;
		
		/**
		 * 
		 */
		public JedisFactory(String ADDR,int PORT,String pwd ) {
			this.ADDR=ADDR;
			this.PORT=PORT;
			this.AUTH=pwd;
			init();
			jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT,AUTH);
		}
		/**
		 * 
		 */
		public JedisFactory(String ADDR,int PORT,String pwd,int dbbase ) {
			this.ADDR=ADDR;
			this.PORT=PORT;
			this.AUTH=pwd;
			init();
			jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT,AUTH,dbbase);
		}
		/**
		 * 
		 */
		public JedisFactory(String ADDR,int PORT) {
			this.ADDR=ADDR;
			this.PORT=PORT;
			init();
			jedisPool = new JedisPool(config, ADDR,PORT,TIMEOUT);
		}

		/**
		 * 方法功能描述 :
		 * @author xiaojun.yin
		 * 2018年12月5日 上午9:29:47
		 */
		private void init() {
			config = new JedisPoolConfig();
			// config.setMaxActive(MAX_ACTIVE);--->maxActive 改成了MaxTotal()
			config.setMaxTotal(MAX_ACTIVE);
			config.setMaxIdle(MAX_IDLE);
			// config.setMaxWait(MAX_WAIT);-----> setMaxWait() 改成了
			// setMaxWaitMillis()
			config.setMaxWaitMillis(MAX_WAIT);
			config.setTestOnBorrow(TEST_ON_BORROW);
		}

		/**
		 * 方法功能描述 :
		 * @author xiaojun.yin
		 * 2018年12月5日 上午9:30:30
		 */
		public Jedis getJedis() {
			try {
				if (jedisPool != null) {// jedisPool={JedisPool@5551}
					Jedis resource = jedisPool.getResource();
					return resource;// resource={Jedis@5622}
				} else {
					return null;
				}
			} catch (Exception e) {
				e.printStackTrace();
				return null;
			}
			
		}
		
		/**
		 * 方法功能描述 :
		 * 
		 * @author xiaojun.yin 2018年12月4日 下午8:49:12
		 */
		public  void closeJedisPool() {
			jedisPool.close();
		}
		
}
